home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / game / think / AmiChess.lha / AmiChess / src / util.c < prev   
C/C++ Source or Header  |  2002-10-31  |  3KB  |  115 lines

  1. #include <string.h>
  2. #include <signal.h>
  3. #include "common.h"
  4.  
  5. #ifdef NO_INLINE
  6.  
  7. unsigned char leadz(BitBoard b)
  8. {
  9. if(b>>48) return lzArray[b>>48];
  10. if(b>>32) return lzArray[b>>32]+16;
  11. if(b>>16) return lzArray[b>>16]+32;
  12. return lzArray[b]+48;
  13. }
  14.  
  15. unsigned char nbits(BitBoard b)
  16. {
  17. return BitCount[b>>48]+BitCount[(b>>32)&0xffff]+BitCount[(b>>16)&0xffff]+BitCount[b&0xffff];
  18. }
  19.  
  20. #endif
  21.  
  22. void UpdateFriends()
  23. {
  24. BitBoard *w,*b;
  25. w=board.b[white];
  26. b=board.b[black];
  27. board.friends[white]=w[pawn]|w[knight]|w[bishop]|w[rook]|w[queen]|w[king];
  28. board.friends[black]=b[pawn]|b[knight]|b[bishop]|b[rook]|b[queen]|b[king];
  29. board.blocker=board.friends[white]|board.friends[black];
  30. }
  31.  
  32. void UpdateCBoard()
  33. {
  34. BitBoard b;
  35. short piece,sq;
  36. memset(cboard,0,sizeof(cboard));
  37. for(piece=pawn;piece<=king;piece++)
  38.     {
  39.     b=board.b[white][piece]|board.b[black][piece];
  40.     while(b)
  41.         {
  42.         sq=leadz(b);
  43.         CLEARBIT(b,sq);
  44.         cboard[sq]=piece;
  45.         }
  46.     }
  47. }
  48.  
  49.  
  50. static const short OrigCboard[64]= 
  51. {
  52. rook,knight,bishop,queen,king,bishop,knight,rook,
  53. pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn,
  54. empty,empty,empty,empty,empty,empty,empty,empty,
  55. empty,empty,empty,empty,empty,empty,empty,empty,
  56. empty,empty,empty,empty,empty,empty,empty,empty,
  57. empty,empty,empty,empty,empty,empty,empty,empty,
  58. pawn,pawn,pawn,pawn,pawn,pawn,pawn,pawn,
  59. rook,knight,bishop,queen,king,bishop,knight,rook
  60. };
  61.  
  62. void UpdateMvboard()
  63. {
  64. short sq;
  65. for(sq=0;sq<64;sq++)
  66.     {
  67.     if(cboard[sq]==empty||cboard[sq]==OrigCboard[sq]) Mvboard[sq]=0;
  68.     else Mvboard[sq]=1;
  69.     } 
  70. }
  71.  
  72.  
  73. void EndSearch(int dummy)
  74. {
  75. SET(flags,TIMEOUT);
  76. signal(SIGINT,EndSearch);
  77. }
  78.  
  79. short ValidateBoard()
  80. {
  81. short side,xside,sq;
  82. if(nbits(board.b[white][king])!=1) return false;
  83. if(nbits(board.b[black][king])!=1) return false;
  84. side=board.side; 
  85. xside=1^side;
  86. if(SqAtakd(board.king[xside],side)) return false;
  87. if(board.ep>-1)
  88.     {
  89.     sq=board.ep+(xside==white?8:-8);
  90.     if(!(BitPosArray[sq]&board.b[xside][pawn]))
  91.     return false;
  92.     }
  93. if(board.flag&WKINGCASTLE)
  94.     {
  95.     if(!(BitPosArray[E1]&board.b[white][king])) return false;
  96.     if(!(BitPosArray[H1]&board.b[white][rook])) return false;
  97.     }
  98. if(board.flag&WQUEENCASTLE)
  99.     {
  100.     if(!(BitPosArray[E1]&board.b[white][king])) return false;
  101.     if(!(BitPosArray[A1]&board.b[white][rook])) return false;
  102.     }
  103. if(board.flag&BKINGCASTLE)
  104.     {
  105.     if(!(BitPosArray[E8]&board.b[black][king])) return false;
  106.     if(!(BitPosArray[H8]&board.b[black][rook])) return false;
  107.     }
  108. if(board.flag&BQUEENCASTLE)
  109.     {
  110.     if(!(BitPosArray[E8]&board.b[black][king])) return false;
  111.     if(!(BitPosArray[A8]&board.b[black][rook])) return false;
  112.     }
  113. return true;
  114. }
  115.